PROGRAM datimeteo
  IMPLICIT NONE         
  INTEGER :: i, j, riga, ios, riga_camini,itmax, riga_classi,ainteger
  BYTE :: k !è il byte da manipolare in base alle select case
  REAL:: a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,minimo,massimo, insolazione,vento, cielo
  ! dichiarazione di array
  real, dimension(:,:), ALLOCATABLE :: matrice !! array bidimensionale dinamico
  real, dimension(4,5) :: camini
  integer, dimension(37) :: classi
  
  OPEN(unit=0, file="tabella.txt")
   riga = 0
   riga_camini = 0
   riga_classi = 0
   minimo = 0
   massimo = 0
   k = 0
  
  !(alloca la dimensione. dell'array. si può anche allocare dopo aver letto i dati dal file 

  ALLOCATE(matrice(30000,11)) 
  do 
    READ (0,*, iostat=ios) a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
    if (ios /= 0) then ! se la iostat diversa da 0 esci altrimenti assegna all'array a1,a2,a3...
      exit
    end if
    riga = riga + 1
    matrice (riga, 1) = a1
    matrice (riga, 2) = a2
    matrice (riga, 3) = a3
    matrice (riga, 4) = a4
    matrice (riga, 5) = a5
    matrice (riga, 6) = a6 	

    matrice (riga, 7) = a7
    if (a7 > massimo) then
      massimo = a7
    else 
      if (a7 < minimo) then
        minimo = a7
      end if  
    end if   
    matrice (riga, 8) = a8
    matrice (riga, 9) = a9
    matrice (riga, 10) = a10
    matrice (riga, 11) = a11
    !riga = riga + 1
  end do    
  itmax = riga

  OPEN(unit=0, file="camini.txt")
  do 
    READ (0,*, iostat=ios) a1,a2,a3,a4,a5
    if (ios /= 0) then ! se la iostat diversa da 0 esci altrimenti assegna all'array a1,a2,a3...
      exit
    end if
    write (*,*) a1,a2,a3,a4,a5
    riga_camini = riga_camini + 1
    camini (riga_camini, 1) = a1
    camini (riga_camini, 2) = a2
    camini (riga_camini, 3) = a3
    camini (riga_camini, 4) = a4
    camini (riga_camini, 5) = a5
  end do    

! leggo la tabella classi.txt  e riempio l'array classi
! questo è l'array delle classi di stabilità che verrà indirizzato da k

OPEN(unit=0, file="classi.txt")
  do 
    READ (0,*, iostat=ios) ainteger
    if (ios /= 0) then ! se la iostat diversa da 0 esci altrimenti assegna all'array x,y,w
      exit
    end if
    write (*,*) ainteger
    riga_classi = riga_classi + 1
    classi (riga_classi) = ainteger
  end do    

 
! ricomincia a leggere l'array riga x colonna e stampa i dati memorizzati
  write (*,*) "Stampo i dati dell'array bidimensionale"
  do i=1,riga_camini
    do j=1,5
      write (*,*) camini (i,j)
    end do
  end do 
  write (*,*) "valore minimo:"
  write (*,*) minimo
  write (*,*) "valore massimo:"
  write (*,*) massimo
  
  
  do i = 1,riga
    insolazione = matrice(i,7)
    vento = matrice(i,8)
    cielo = matrice(i,5) ! valore di prova, da leggere e convertire in ottavi
    Call ClasseStabilita(insolazione, vento, cielo, k, massimo)
    write (*,*) "Classe"
    write (*,*) classi(k)
  end do
  !DeAllocate (matrice)
  
  STOP   
END PROGRAM datimeteo

SubRoutine ClasseStabilita(insolazione, vento, cielo, k, massimo)
  ! inserire le istruzioni qui e le eventuali ri-dichiarazioni dei parametri
  real insolazione, vento, cielo, massimo
  byte k
  !if (((vento >= 3) .and. (vento <=5)) .and. ((insolazione >= 0) .and. (insolazione <= massimo*33/100))) then

!! esame delle condizioni del vento

  if (vento < 2) then 
    k = IBCLR(k,3) !setta il 4 bit a 0
    k = IBCLR(k,4)
    k = IBCLR(k,5)
  else 
    if ((vento >= 2) .and. (vento <=3)) then
      k = IBSET(k,3)
      k = IBCLR(k,4)
      k = IBCLR(k,5)
    else     
      if ((vento >= 3) .and. (vento <=5)) then
        k = IBSET(k,4)
        k = IBCLR(k,3)
        k = IBCLR(k,5)
      else
        if ((vento >= 5) .and. (vento <=6)) then
        k = IBSET(k,3)
        k = IBSET(k,4)
        k = IBCLR(k,5)
        else
          ! è necessariamente maggiore di 6
          k = IBCLR(k,3)
          k = IBCLR(k,4)
          k = IBSET(k,5)       
        end if              
      end if  
    end if
  end if
      
!! esame delle condizioni di insolazione   
  if ( insolazione == 0 ) then 
    k = IBCLR(k,1) ! azzera i due bit dell'insolazione
    k = IBCLR(k,2) ! azzera i due bit dell'insolazione
    if (cielo <= 0.5) then
      k = IBCLR(k,0) ! azzera il bit 0
    else  
      k = IBSET(k,0) ! setta a 1 il bit 0
    end if
  else  
    if ((insolazione > 0) .and. (insolazione <= massimo*33/100)) then
	  k = IBCLR(k,1)
	  k = IBCLR(k,2)
	 else 
	   if ((insolazione >= massimo*33/100) .and. (insolazione <= massimo*66/100)) then
	     k = IBSET(k,1)
	     k = IBCLR(k,2)
	   else 
	     if ((insolazione >= massimo*66/100) .and. (insolazione <= massimo*100/100)) then
	       k = IBCLR(k,1)    
	       k = IBSET(k,2)      
	     end if   
	   end if 
	end if  
  end if
!! esame della copertura nuvolosa
  
  
   write (*,*) "Vento"
   write (*,*) Vento
   write (*,*) "Insolazione"
   write (*,*) insolazione
   write (*,*) "Cielo"
   write (*,*) cielo
   write (*,*) "33%-66%-100%"
   write (*,*) massimo * 33/100
   write (*,*) massimo * 66/100
   write (*,*) massimo * 100/100
   
   write (*,*) "K dopo tutte le condizioni"
   write (*,*) k
   k = k + 1 !! un valore in più perché iniziamo da riga 1 non da riga 0
     
end subroutine ClasseStabilita
  
SubRoutine Calcolo2
  ! inserire le istruzioni qui e le eventuali ri-dichiarazioni dei parametri
end subroutine Calcolo2
